// 交叉类型（Intersection Types）:
// 交叉类型是将多个类型合并为一个类型。 这让我们可以把现有的多种类型叠加到一起成为一种类型，它包含了所需的所有类型的特性。 例如， Person & Serializable & Loggable同时是 Person 和 Serializable 和 Loggable。 就是说这个类型的对象同时拥有了这三种类型的成员。

// 我们大多是在混入（mixins）或其它不适合典型面向对象模型的地方看到交叉类型的使用。

// 定义一个函数
interface ObjectConstructor {
  assign<T, U>(target: T, source: U): T & U;
}
interface A {
  name: string,
  age: number,
  sayName: (name: string) => void
}
interface B {
  name: string,
  gender: string,
  sayGender: (gender: string) => void
}

let a: A & B = {
  name: "11",
  age: 1,
  gender: 's',
  sayName: (name) => {
    console.log(name);
  },
  sayGender: (gender) => {
    console.log(gender);
  }

}
console.log(a.sayGender, 1);
